1. rmarkdownknitr을 사용한 R 마크다운 문서 작성

(1) 개관

  • 마크다운(markdown)
    • 정의: 문서 생성 및 formatting을 위한 마크업(markup) 언어.
    • rmarkdown 패키지
      • 텍스트, R 코드, R 코드 결과물을 통합하여 다양한 형식([EX] HTML, MS 워드, PDF 등)의 문서로 만들어줌.
      • R 마크다운 문서(R markdown document, 이하 Rmd)
        • R 스크립트보다 훨씬 가독성이 높고, 다양한 정보를 포함할 수 있음.
        • YAML 메타데이터/제목, 텍스트, 코드 덩이(code chunk)로 구성됨.

[그림 1] R을 통해 생성할 수 있는 다양한 문서 결과물의 형태

  • R 마크다운의 장점
    • 재현가능성(reproducible): 독립적 연구자가 새로운 데이터로 동일한 절차를 사용하여 동일한 결과를 재생성할 수 있도록 하는 데 충분한 정보(데이터와 코드)를 제공할 수 있다면, 해당 연구결과는 재현가능하다고 간주할 수 있음.
    • 협업 가능성(collaborative): 동료들과 연구(데이터와 코드)를 공유하고 함께 수행 가능.
    • 효율성(efficient): 출력을 자동적으로 생성하고 업데이트할 수 있음([EX] HTML, MS 워드, PDF 등).

[그림 2] R 마크다운 가이드

  • 출처: https://www.rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf

  • knitr 패키지

    • 마크다운 문법에 바탕을 둔 R 마크다운 문서가 완성되면, 해당 문서는 knitr 패키지를 통해 렌더링(rendering)됨.
    • R 코드 입력, R 코드 출력, 플롯, 경고문, 메시지, 에러 등을 문서에 모두 나타낼 수 있음.
    • 다양한 옵션을 통해 그래픽을 융통성 있게 제시 가능: 플롯의 너비와 높이, 위치, 출력 개수 등.
    • 문서생성 절차(render 함수의 기능)
      1. Rmd 파일 \(\rightarrow\) knitr리 코드 덩이를 실행하고 새로운 마크다운(.md) 문서를 생성.
      2. md 파일 \(\rightarrow\) pandoc이라는 최종 포맷을 생성하는 프로그램의 처리를 거침.
      3. 지정된 포맷([EX] HTML, PDF, MS Word) 문서 출력.

[그림 3] 렌더링을 통해 R 마크다운(Rmd) 파일을 HTML 문서로 변환하기

[그림 4] Rmd 렌더링 흐름도

(2) 주요 패키지 및 소프트웨어 설치하기

# R 마크다운 관련 패키지 설치하기.
package.vec <- c("lubridate",
                 "knitr", "rmarkdown", "markdown", "bookdown", "caTools", "bitops"
                 )
install.packages(package.vec)
  • PDF 문서 렌더링을 하려면 한글용 LaTeX 프로그램이 설치되어 있어야 함.
    • 한글용 LaTex 윈도우 설치: TexLive.
    • tinytext 패키지 설치한 것 지우기: tinytex::uninstall_tinytex().

(3) R 마크다운 문서(Rmd) 생성

  • 문서유형: HTML, PDF, MS Word.
  • 템플릿
    • R 제공 템플릿.
    • 커스텀 템플릿.

[그림 5] Rmd 템플릿 선택하기

(4) 기본 문법

A. 제목 텍스트

  • 해시태그 #를 하나씩 덧붙일 때마다 수준이 내려감.
  • # 제목 1, ## 제목 2, ## 제목 3…

B. 단순 텍스트

  • 단순 텍스트: YAML 제목 밑에 텍스트를 써서 붙이면 됨. 새로운 단락을 시작하려면 줄바꿈을 하거나, 텍스트 라인 뒤에 스페이스를 2개 두면 됨.

C. 볼드체와 이탤릭체

  • 볼드
    • 텍스트 양쪽에 별표(*)를 두 개 붙임.
    • 텍스트 양쪽에 언더바(_)를 두 개 붙임.
  • 이탤릭체
    • 텍스트 양쪽에 별표(*)를 한 개 붙임.
    • 텍스트 양쪽에 언더바(_)를 한 개 붙임.

[그림 6] 볼드체와 이탤릭체 적용하기

D. 리스트

  • 순서를 매기지 않은 리스트
    • 별표 하나(*) & 스페이스 뒤에 텍스트를 붙이면 됨.
    • 하위 목록은 탭 1개 또는 스페이스 2개 & 더하기(+) 또는 빼기(-) 기호 & 스페이스 뒤에 텍스트를 붙이면 됨.

[그림 7] 순서를 매기지 않은 리스트 적용하기

  • 순서를 매긴 리스트
    • 숫자 & 마침표(.) & 스페이스 뒤에 텍스트를 붙이면 됨.
    • 숫자를 매기지 않은 하위 목록을 추가하려면, 탭 1개 또는 스페이스 2개 & 더하기(+) 또는 빼기(-) 기호 & 스페이스 뒤에 텍스트를 붙이면 됨.

[그림 7] 순서를 매기지 않은 리스트 적용하기

E. 문서 내 섹션 링크

  • 문서 내 섹션으로 가는 링크를 만들려면 사각괄호([]) 안에 섹션의 이름을 넣으면 됨. 링크를 클릭하면 해당 섹션으로 가게 됨.

[1.rmarkdwon과 knitr을 사용한 R 마크다운 문서 작성]

[1. rmarkdwon과 knitr을 사용한 R 마크다운 문서 작성]

F. 하이퍼링크

  • URL을 그대로 복붙하기.
  • 링크를 텍스트 안에 숨기려면 사각괄호([]) 안에 텍스트를 넣고, 둥근 괄호() 안에 URL을 넣으면 됨.

[수업자료 깃허브 저장소](https://github.com/cognitivepsychology/data_science_for_psycholinguistics)

수업자료 깃허브 저장소

G. 이미지 삽입

  • 느낌표(!) 뒤에 사각괄호를 붙인 뒤 [] 둥근 괄호() 안에 이미지 파일 경로를 넣으면 됨.

![](images/week12/rmarkdown.png)

[그림 8] rmarkdown 패키지 심볼 이미지

![이미지용 캡션](images/week12/rmarkdown.png)

[그림 9] rmarkdown 패키지 심볼 이미지에 캡션 달기

이미지용 캡션

![이미지용 캡션](images/week12/rmarkdown.png){width=100px}

[그림 11] rmarkdown 패키지 심볼 이미지에 사이즈 설정하기

이미지용 캡션

<center> ![이미지용 캡션](images/week12/rmarkdown.png){width=100px} </center>

[그림 12] rmarkdown 패키지 심볼 이미지 위치 선정하기

이미지용 캡션

G. 인용

1) 블록 인용(blockquote)

  • 텍스트 앞뒤로 한 행씩 띄운 뒤, > & 스페이스 다음에 인용할 텍스트를 넣으면 됨.

텍스트 블록 인용.

2) 단순 인용

  • 텍스트 앞 뒤로 백팁 세 개(```) 이상을 넣으면 됨.
텍스트 단순 인용.

G. 기타

1) 수학 기호 삽입

  • 문장 밖에 수식을 입력하는 경우: $$를 수식 앞뒤로 붙이기.

\[y=x^2\]

  • 문장 안에 수식을 입력하는 경우: $를 수식 앞뒤로 붙이기.

문장 안에 수식 \(4=2 \times 2\)을 넣기.

2) 글자에 색상 입히기(HTML 문서 한정)

  • <span style="color: 색상명"></span> 사이에 텍스트를 넣으면 됨.
[EX] 장미는 <span style="color: red">**빨간색**</span>이고, 제비꽃은 <span style="color: blue">파란색</span>이다.

[EX] 장미는 빨간색이고, 제비꽃은 파란색이다.

(5) YAML 메타데이터

  • YAML(Yet Another Multicolumn Layout)
    • 문서의 맨앞에 배치.
    • 문서의 메타정보([EX 제목(title), 저자(author), 날짜(date), 출력 모수(output) 등을 설정.

A. 문서의 제목

  • title: "내 문서의 제목": 문서 맨 앞에 큰 서체로 내가 설정한 제목이 나오게 됨.
  • subtitle: "내 문서의 하위제목": 문서 맨 앞에 제목보다 작은 서체로 내가 설정한 하위제목이 나오게 됨.

B. 저자

  • author: "내 이름": 제목 밑에 제시.

C. 날짜

  • 고정된 날짜: date: "2022년 5월 23일 화요일": 저자 밑에 제시.
  • 날짜 업데이트: 문서를 렌더링할 때마다 날짜를 수시로 업데이트하고자 할 경우, date: "`\r format(Sys.Date())`"(슬래시 제외).

D. 목차

  • toc: true로 지정하면 고정된 목차가 생성됨.
  • toc_float: true로 지정하면 유동적 목차가 생성됨.

E. 테마

  • theme: 테마명: 테마 갤러리에서 고를 수 있음.
  • css: 파일명.css: HTML 스타일(서체 유형, 색상, 크기 등) 설정 가능.
  • mainfont: 서체이름: 문서 메인 서체 설정 가능.

F. 코드 접기

  • code_folding: show: 해당 정보를 추가하면 출력 시 코드를 보여줌.
  • code_folding: hide: 해당 정보를 추가하면 출력 시 코드를 가려줌.

G. 출력(output)

  • 출력 관련 논항
    • html_document
    • html_notebook
    • pdf_document: latex_engine: xelatex 논항을 밑에 추가하기.
    • word_document
      • 스타일을 지정한 MS Word 파일을 생성하여 프로젝트 폴더에 저장.
      • reference_docx: 스타일_지정_워드_파일명.docx 논항을 밑에 추가하기.
  • Knit 버튼 옵션
    • Knit to HTML
    • Knit to PDF
    • Knit to Word
  • Knit 버튼 옵션 중 하나를 클릭하면 YAML 메타데이터가 자동으로 업데이트됨.
  • 두 가지 이상의 문서 유형을 동시에 렌더링 가능.
    • word_document: default
    • html_document: default
    • pdf_document: default

[그림 13] pdf 및 word 출력 관련 논항 설정하기

(6) 코드 덩이

A. 코드 덩이 입력

  • 소스창에서 Ctrl + Alt + I를 누르거나, ```{r} 코드 덩이 ```을 입력하면 코드 덩이를 삽입할 수 있음.

B. 옵션

  • name: {r my_code_chunk_name} 형식으로 설정 가능. 굳이 넣지 않아도 됨.
  • echo: 렌더링 후 코드가 출력문서에 제시됨(default = TRUE).
  • eval: 해당 코드를 실행함(default = TRUE).
  • 이미지 관련 옵션
    • fig.width, fig.height: 해당 코드 덩이를 통해 생성되는 이미지([EX] 플롯, 지도 등)의 사이즈 설정. [EX] fig.width = 10, fig.height = 3
    • fig.align: 이미지의 위치 설정. left, right, center 중 선택. [EX] fig.align = center)
    • fig.cap: 이미지의 캡션 설정. fig.cap = "Iris 데이터셋의 산점도"
```{r,iris_data, fig.width = 10, fig.height = 3, fig.align = "center", fig.cap = "Iris 데이터셋의 산점도", echo=T}
2 + 2
## [1] 4
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.6     v dplyr   1.0.7
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   2.0.1     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
data(iris)
ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
  geom_point()
Iris 데이터셋의 산점도

Iris 데이터셋의 산점도

```
  • message: 렌더링 후 메시지가 출력문서에 제시됨(default = TRUE).
    • message=T로 설정한 경우
```{r,iris_data_1, echo=T, message=T}
# car 패키지 불러오기.
library(car)
## 필요한 패키지를 로딩중입니다: carData
## 
## 다음의 패키지를 부착합니다: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
```
  • message=F로 설정한 경우
```{r,iris_data_2, echo=T, message=F}
# psych 패키지 불러오기.
library(psych)
```
  • include: 렌더링 시 해당 코드를 실행한 후 문서에 제시함(default = TRUE).
    • include=T로 설정한 경우
```{r,iris_data_3, fig.width = 10, fig.height = 3, fig.align = "right", fig.cap = "Iris 데이터셋의 산점도", echo=T, include=T}
4 + 4
## [1] 8
ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) +
  geom_point()
Iris 데이터셋의 산점도

Iris 데이터셋의 산점도

```
  • include=F로 설정한 경우: 코드와 결과 모두 제시되지 않음.

  • error: 렌더링 후 에러 메시지가 출력문서에 제시됨(default = FALSE).

  • collapse: 출력 블록과 소스 코드 블록 간에 공간을 둠(default = FALSE).

    • collapse=T로 설정한 경우
```{r,math_1, eva=T, echo=T, include=T, collapse=T}
1+1
## [1] 2
1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
```
  • collapse=F로 설정한 경우: 출력과 코드가 하나의 블록 안에 제시됨.
```{r,math_2, eva=T, echo=T, include=T, collapse=F}
1+1
## [1] 2
1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
```
  • results: 출력을 제시하는 방식 설정(default = markup).
    • asis: 표 결과물 출력.
    • hide: 모든 출력 제시하지 않음.
    • hold: 모든 코드 밑에 출력 제시.
    • FALSE: 텍스트 출력 제시하지 않음.
  • 표 넣기: knitr 패키지의 kable 함수 사용.
```{r,mtcars, eval=T, echo=T, results = "asis"}
knitr::kable(mtcars[, 1:5], caption = "**<표 1> mtcars 데이터셋 표**")
<표 1> mtcars 데이터셋 표
mpg cyl disp hp drat
Mazda RX4 21.0 6 160.0 110 3.90
Mazda RX4 Wag 21.0 6 160.0 110 3.90
Datsun 710 22.8 4 108.0 93 3.85
Hornet 4 Drive 21.4 6 258.0 110 3.08
Hornet Sportabout 18.7 8 360.0 175 3.15
Valiant 18.1 6 225.0 105 2.76
Duster 360 14.3 8 360.0 245 3.21
Merc 240D 24.4 4 146.7 62 3.69
Merc 230 22.8 4 140.8 95 3.92
Merc 280 19.2 6 167.6 123 3.92
Merc 280C 17.8 6 167.6 123 3.92
Merc 450SE 16.4 8 275.8 180 3.07
Merc 450SL 17.3 8 275.8 180 3.07
Merc 450SLC 15.2 8 275.8 180 3.07
Cadillac Fleetwood 10.4 8 472.0 205 2.93
Lincoln Continental 10.4 8 460.0 215 3.00
Chrysler Imperial 14.7 8 440.0 230 3.23
Fiat 128 32.4 4 78.7 66 4.08
Honda Civic 30.4 4 75.7 52 4.93
Toyota Corolla 33.9 4 71.1 65 4.22
Toyota Corona 21.5 4 120.1 97 3.70
Dodge Challenger 15.5 8 318.0 150 2.76
AMC Javelin 15.2 8 304.0 150 3.15
Camaro Z28 13.3 8 350.0 245 3.73
Pontiac Firebird 19.2 8 400.0 175 3.08
Fiat X1-9 27.3 4 79.0 66 4.08
Porsche 914-2 26.0 4 120.3 91 4.43
Lotus Europa 30.4 4 95.1 113 3.77
Ford Pantera L 15.8 8 351.0 264 4.22
Ferrari Dino 19.7 6 145.0 175 3.62
Maserati Bora 15.0 8 301.0 335 3.54
Volvo 142E 21.4 4 121.0 109 4.11
```

2. Git을 활용한 version control

(1) Git

A. Git 프로그램 소개

  • 기원: Git은 2005년 Linus Torvalds가 2005년에 만든 분산형 버전 관리 시스템(Distributed version control systems, DVCS).

1) 이력관리(version control)

  • 이력관리의 어려움: 파일(소스 코드)을 편집 전 상태로 되돌리는 가장 쉬운 방법은 편집하기 전에 파일을 미리 복사해두는 것. 그러나 파일을 편집할 때마다 매번 복사하는 일은 매우 번거롭고 실수할 가능성도 높음.

[그림 14] 버전별로 파일 복사 및 저장하기

  • 소스 코드를 효과적으로 관리하기 위해 개발된 버전 관리 시스템
    • 소스 코드가 변경된 이력을 쉽게 확인할 수 있고, 특정 시점에 저장된 버전과 비교하거나 특정 시점의 버전으로 되돌아가는 것도 가능함.
    • Git으로 파일을 관리하면 업데이트 이력이 Git에 저장됨. 따라서 매번 백업용 파일 복사본을 만들 필요가 없음.
    • 내가 올리려는 파일이 누군가가 편집한 내용과 충돌할 경우, 서버 업로드 시 경고 메시지 발생. 따라서 누군가가 편집한 내용을 덮어쓰는 불상사 방지 가능.

[그림 15] Git을 통한 버전 관리

2) 이력을 관리하는 저장소(Git repository)

  • Git 저장소(Git repository): 파일이나 폴더를 저장해두는 곳. 이때 파일이 변경이력별로 구분되어 저장. 같은 파일이라도 문구 하나만 달라져도 다른 파일로 인식하므로, 파일을 변경사항별로 구분하여 저장 가능.

[그림 16] Git 저장소를 사용한 파일 상태 저장

  • Git 저장소의 유형
    • 원격 저장소(remote repository): 파일이 원격 저장소 전용 서버에서 관리되며, 여러 사람이 함께 공유 가능.
    • 로컬 저장소(local repository): 내 컴퓨터에 파일이 저장되는 개인 전용 저장소.
    • 원리
      • 푸시(push): 평소에는 내 컴퓨터의 로컬 저장소에서 작업하다 작업한 내용을 공개하고자 할 때 원격 저장소에 업로드할 수 있음.
      • 풀(pull): 원격 저장소에서 나 또는 다른 사람이 작업한 파일을 로컬 저장소로 불러올 수 있음.

[그림 17] 원격 저장소와 로컬 저장소

  • 로컬 저장소 만드는 법
    • 로컬 저장소 새로 만들기.
    • 이미 만들어진 원격 저장소를 로컬 저장소로 복사해 오기.

3) 변경사항을 기록하는 커밋(commit)

  • 변경사항을 저장소에 기록하려면 커밋을 실행해야 함.
  • 정의: 스테이지(stage)에 올린 파일들에 대해 스냅샷을 찍는 것.
  • 커밋을 실행하면 이전 커밋 상태부터 현재 상태까지의 변경이력이 기록된 커밋 또는 리비전(revision)이 생성됨.
  • 각 커밋에는 영문 및 숫자로 이루어진 40자리 고유 이름이 붙음. 저장소에선 이 이름에 따라 커밋을 구분하고 선택함.
  • 커밋 메시지
    • 커밋은 이력을 남기는 중요한 작업이므로, 커밋을 실행할 때는 커밋 메시지를 반드시 입력해야 함.
    • 요령
      1. 첫 번째 줄: 변경내용 요약.
      2. 두 번째 줄: 빈 칸.
      3. 세 번째 줄: 변경한 이유.

[그림 18] 커밋의 절차

4) 작업 트리(work tree)와 인덱스(index)

  • 작업 트리: Git에서 폴더를 가리키는 이름.
  • 인덱스: 커밋 실행 전 저장소와 작업 트리 사이에 존재하는 공간. 인덱스가 중간에 있는 덕분에, 작업 트리 안에 있는 파일 중 일부만 인덱스에 등록하여 커밋할 수 있음.
  • 커밋의 원리
    1. 작업 트리에 있는 변경사항을 곧바로 저장소에 기록하지 않고, 저장소와 작업트리 사이의 인덱스에 스테이징(staging)함.
    2. 저장소에 변경사항을 기록하려면 해당 변경사항은 일단 인덱스에 있어야 함.
    3. 스테이징의 예시: 10개의 파일을 수정했는데 그중 7개만 저장소에 공개하고자 할 경우, 변경된 10개의 파일 중 7개를 선택하여 인덱스에 스테이징할 수 있음.

[그림 19] 작업 트리와 인덱스

5) 원격 저장소 공유

  • 원격 저장소에 푸시(push)하기
    • 정의: 로컬 저장소에서 변경된 이력을 웹상의 원격 저장소에 공유하려면, 로컬 저장소의 변경이력을 원격 저장소에 업로드해야 하는데 이 과정을 푸시라고 함.
    • 효과: 푸시를 실행하면 원격 저장소에 내 변경이력이 업로드되어, 원격 저장소와 로컬 저장소가 동일한 상태가 됨.

[그림 20] 푸시의 절차

  • 원격 저장소 복제(clone)하기: 원격 저장소의 내용을 통째로 복제해 다운로드하는 것. 복제한 저장소를 내 컴퓨터에서 로컬 저장소로 사용할 수 있게 됨.

[그림 21] 클론의 절차

  • 원격 저장소에서 풀(pull) 해오기: 원격 저장소에 올려놓은(push) 변경내용을 로컬 저장소에 적용하는 것. 풀을 실행하면 원격 저장소에서 최신 변경이력을 다운로드하여 로컬 저장소에 그 내용을 적용하게 됨.

[그림 22] 풀의 절차

B. Git 설치

  1. Git 다운로드를 클릭하여 설치하기.
  2. Git Bash 앱 실행하기.
  3. $ git 실행하기.
  4. Git 환경 설정
    • 사용자 이름 설정: $ git config --global user.name "사용자 이름"
    • 사용자 이메일 설정: $ git config --global user.email "사용자 이메일" \(\rightarrow\) 나중에 Github 가입 시 필요하므로 기억해두기!
    • 입력값 확인: $ git config --list \(\rightarrow\) user.nameuser.email이 입력한 대로 나온다면 기본적 세팅 완료!

[그림 23] Git 환경 설정

C. Github 가입하기

  1. Github 웹사이트를 클릭하여 Sign up 버튼 누르기.
  2. 이메일, 비밀번호, 사용자 이름 넣기(Git 환경 설정 시 사용한 정보여야 함!).
  3. 이메일 주소 확인 후 회원가입 완료.
  4. Github 로그인 후 우측 상단의 + 버튼 클릭 \(\rightarrow\) New repository 클릭.
  5. 소유자 이름과 저장소 이름 설정하기.
  6. Github 저장소 웹사이트 주소 확인하기.

[그림 24-1] Github 가입 절차: 깃허브 가입하기

[그림 24-2] Github 가입 절차: 깃허브에서 보낸 이메일 확인

[그림 24-3] Github 가입 절차: 새 저장소 메뉴 선택

[그림 24-4] Github 가입 절차: 새 저장소 만들기

[그림 24-5] Github 가입 절차: 내 저장소 주소

[그림 24-6] Github 가입 절차: 내 저장소 화면

(2) Sourcetree

A. Sourcetree 프로그램 소개

B. Sourcetree 설치

  1. 공식 웹사이트에 접속하여 프로그램 다운로드받기.

[그림 25] 소스트리 다운로드

  1. 등록.

[그림 26-1] 등록 선택

[그림 26-2] 로그인 계정 선택

[그림 26-3] 사용자 이름 입력

[그림 26-4] 권한 허용

[그림 26-5] 등록 완료

  1. 도구 설치.

[그림 27] 설치할 도구 선택

  1. Preferences 설정.

[그림 28-1] Preferences 설정

[그림 28-2] SSH 키 불러오기(아니오 선택)

[그림 28-3] 설치완료

  1. Git 폴더 연동.

[그림 29-1] 상단 메뉴바의 Add 클릭

[그림 29-2] 탐색을 눌러 폴더 경로 찾기

[그림 29-3] 탐색을 눌러 폴더 경로 찾기(해당 폴더 밑에 .git 폴더 자동 생성)

[그림 29-4] 로컬 저장소 추가 버튼 클릭하기

[그림 29-5] 로컬 저장소 추가 완료

C. Sourcetree 주요 기능 소개

  • 커밋: Git과 동일.
  • 풀: Git과 동일.
  • 푸시: Git과 동일.
  • 브랜치(branch)
    • Git에 있는 기능. 커밋 사이를 가볍게 이동할 수 있는 포인터 같은 것.
    • 기본적으로 Git은 master 브랜치를 만듦. 최초의 커밋은 이 master 브랜치가 생성된 커밋을 가리킴. 이후 커밋을 실행하면 master 브랜치는 자동으로 가장 마지막 커밋을 가리키게 됨.
    • 브랜치 간 이동 가능
      • B 브랜치에서 일을 하고, 다시 원래 A 브랜치로 되돌아와서 다른 일을 하는 것이 가능함. 두 작업내용은 서로 독립적으로 개별 브랜치에 존재함. 커밋 사이를 자유롭게 이동하다가 때가 되면 두 브랜치를 병합(merge)할 수 있음.
      • 브랜치 이동 시 워킹 디렉토리의 파일이 그 브랜치에서 가장 마지막으로 했던 작업 내용으로 변경됨.
  • 병합(merge): 두 개의 브랜치를 하나로 합치는 것.

References